package com.kaifamiao.jdbc.meta;

import java.sql.*;

public class GetResultSetMetaData {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        String driverClassName = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/kaifamiao?serverTimezone=Asia/Chongqing";
        String username = "kfm";
        String password = "kfm";

        /*
        String driverClassName = "oracle.jdbc.OracleDriver";
        String url = "jdbc:oracle:thin:@localhost:1521:kaifamiao";
        String username = "kaifamiao";
        String password = "kaifamiao";
         */

        // 加载并注册驱动
        Class.forName(driverClassName);
        // 建立连接
        Connection conn = DriverManager.getConnection(url, username, password);
        // 创建Statement
        PreparedStatement ps = conn.prepareStatement( "SELECT * FROM emp" );
        // "执行"SQL
        ResultSet rs = ps.executeQuery();

        // 通过结果集对象获得结果集元数据
        ResultSetMetaData meta = rs.getMetaData();
        // 根据结果集元数据获得查询结果中的列数
        final int columnCount = meta.getColumnCount();
        // 依次处理各个列
        for( int i = 1 ; i <= columnCount ; i++ ){
            // 获得查询结果中第 i 列的 列名 或 别名
            String label = meta.getColumnLabel( i );
            // 获得查询结果中第 i 列的 SQL类型
            int sqlType = meta.getColumnType( i );
            // 获得查询结果中第 i 列的 SQL类型名称
            String sqlTypeName = meta.getColumnTypeName( i );
            // 获得查询结果中第 i 列的最大显示宽度
            int size = meta.getColumnDisplaySize( i );
            // 获得查询结果中第 i 列对应的 Java类型名称
            String className = meta.getColumnClassName( i );
            System.out.println( label + "\t" + sqlType + "\t" + sqlTypeName + "\t" + size + "\t" + className);
        }

        // 判断是否存在下行数据需要处理
        while ( rs.next() ) {
            // 依次处理当前行各个列
            for( int i = 1 ; i <= columnCount ; i++ ){
                // 获得查询结果中第 i 列的 列名 或 别名
                String label = meta.getColumnLabel( i );
                // 获得查询结果中第 i 列的 值
                Object value = rs.getObject( i );
                System.out.print( label + "=" + value + ( i < columnCount ? ", " : "\n") );
            }
        }

        // 释放资源
        rs.close();
        ps.close();
        conn.close();
    }
}
